//////////////////////////////////////////////////////////////////////////
// NO_Base
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
#define NO_TAL_EXPORT

//////////////////////////////////////////////////////////////////////////
#include "NO_Externs.h"
#include "NO_Base.h"

//////////////////////////////////////////////////////////////////////////
NO_IBase::NO_IBase():id(0),next(0){}
NO_IBase::~NO_IBase(){}

//////////////////////////////////////////////////////////////////////////
NO_Int32 NO_IBase::getID(void)const{return id;}

//////////////////////////////////////////////////////////////////////////
// class NO_BaseFriend definition
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
const NO_IBase*	NO_BaseFriend::getNext	(const NO_IBase* b)			const {return b->next;}
void			NO_BaseFriend::setNext	(NO_IBase* b, NO_IBase* n)	const {b->next = n;}
void			NO_BaseFriend::setID	(NO_IBase* b, NO_UInt32 i)	const {b->id = i;}

//////////////////////////////////////////////////////////////////////////
// NO_BaseList
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// con/destruction
//////////////////////////////////////////////////////////////////////////
NO_BaseList::NO_BaseList(void):first(0),last(0){}
NO_BaseList::~NO_BaseList()
{
	const NO_IBase * iter = first;
	const NO_IBase * kill = 0;
	while(iter)
	{
		kill = iter;
		iter = getNext(iter);
		delete kill;
	}
}

//////////////////////////////////////////////////////////////////////////
// modify
//////////////////////////////////////////////////////////////////////////
NO_Boolean NO_BaseList::addBase(NO_IBase* obj)
{
	NO_UInt32 hash = obj->getBaseType().getID();
	setID(obj, hash);
	if(!first){first = obj;}
	if(last){setNext(last,obj);}
	last = obj;
	return 1;
}

//////////////////////////////////////////////////////////////////////////
// retrieve
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
const NO_IBase* NO_BaseList::findBaseImpl(const NO_Int8* name) const
{
	NO_UInt32 hash = noGetHash(name);
	return findBaseImpl(hash);
}

//////////////////////////////////////////////////////////////////////////
const NO_IBase* NO_BaseList::findBaseImpl(NO_UInt32 ID) const
{ 
	const NO_IBase * iter = first;
	while(iter)
	{
		if (iter->getID()==ID){return iter;}
		iter = getNext(iter);
	}
	return 0;
}

//////////////////////////////////////////////////////////////////////////
const NO_IBase* NO_BaseList::beginBaseImpl	(void)				const {return first;}
const NO_IBase* NO_BaseList::endBaseImpl	(void)				const {return 0;}
const NO_IBase* NO_BaseList::nextBaseImpl	(const NO_IBase* i)	const {return getNext(i);}

//////////////////////////////////////////////////////////////////////////
// NoneBase
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
// con/destruction
//////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////
NO_NoneBases::NO_NoneBases(void){}
NO_NoneBases::~NO_NoneBases(void){}

//////////////////////////////////////////////////////////////////////////
// retrieve
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
const NO_IBase* NO_NoneBases::findBaseImpl(const NO_Int8* name)	const{return 0;}
const NO_IBase* NO_NoneBases::findBaseImpl(NO_UInt32 ID)		const{return 0;}

//////////////////////////////////////////////////////////////////////////
const NO_IBase* NO_NoneBases::beginBaseImpl	(void)				const {return 0;}
const NO_IBase* NO_NoneBases::endBaseImpl	(void)				const {return 0;}
const NO_IBase* NO_NoneBases::nextBaseImpl	(const NO_IBase*)	const {return 0;}

